Amazon API Gateway のプライベート REST API でカスタムドメインが使えるようになっていたので設定してみた

Amazon API Gateway のプライベート REST API でカスタムドメインが使えるようになっていたので設定してみた

Clock Icon2025.01.06

いわさです。

API Gateway ではエンドポイントタイプというものがあり、エッジ・リージョナル・プライベートと選択することが出来ます。
API Gateway では通常はパブリックなエンドポイントを作成することが多いのですが、プライベートネットワーク内からのみアクセス出来る API を作成したい場合にプライベートエンドポイントタイプを選択することが出来ます。
よくあるユースケースとしてはオンプレミスから Direct Connect や VPN を経由して API Gateway を使うパターンです。

このプライベート API が、少し前の 2024 年 11 月のアップデートでカスタムドメインをサポートしました。

https://aws.amazon.com/about-aws/whats-new/2024/11/amazon-api-gateway-custom-domain-name-private-rest-apis/

こちらのアップデートについて、ちょっと時間が経ってしまったのですが実際に作成して試す機会があったので紹介します。

これまではプライベート API のカスタムドメインはサポートされていなかった

実はこれまでプライベート API についてはカスタムドメインを使うことが出来ませんでした。
エッジやリージョナルなどのパブリック API の場合は使えました。

API Gateway では組み込みのカスタムドメイン機能を構成する際に ACM などの証明書を関連付けします。API Gateway は HTTPS が必須なので名前解決だけしてやっても組み込み機能が対応していないプライベート API では利用が出来ませんでした。

そのため、ワークアラウンドとしては以下の記事のようにカスタムドメインは NLB/ALB などを名前解決先とし、そのうしろに API Gateway にプロキシさせるような、多段でちょっと冗長な構成を取らざるを得ませんでした。

https://repost.aws/ja/knowledge-center/invoke-private-api-gateway

設定方法

ということで実際に設定してみましょう。
前提として、既にプライベート API を作成済みで、VPC 内の CloudShell からのみ VPC エンドポイント経由でアクセスが可能です。

A44B6F1B-64CE-4788-902C-0F5EC179CD11.png

0947D952-CEDB-49FD-BC03-EB11126C7C28_4_5005_c.jpeg

API Gateway のカスタムドメイン名を追加

API Gateway の全体メニューに「カスタムドメイン」という機能が従来からあります。  
まずはこちらで新しいドメインを追加します。

F0D0BA7D-7A7A-444C-B123-E40525665978.png

すると、次にようにカスタムドメインのタイプを選択出来るようになっていました。
従来のものが「パブリック」、今回新しく選択出来るようになったものが「プライベート」です。
ここではマッピングなどはまだ行わずに ACM 証明書だけ選択します。証明書はワイルドカードも選択出来ます。また、あとから変更も可能です。

D1803E84-1130-4740-8664-FAB637E96FF9.png

カスタムドメインを作成したら、色々と設定を行っていきます。詳細画面を開きましょう。

6602EBA8-46AE-4BAF-861E-F935B4C40945.png

まずは API マッピングを行います。
このあたりは従来のパブリックカスタムドメインを設定する場合と同じですね。

5C9AA475-E5D6-43B1-8AA5-D05B56C6D2B6.png

254A3611-C090-4C8E-8CC0-17E86F94E753.png

続いて、これはプライベートカスタムドメイン固有の新要素になりまして、リソース共有タブから「ドメイン名アクセスの関連付け」を行う必要があります。要はどの VPC エンドポイントからカスタムドメインを呼び出して良いかを関連付けという形で設定します。

0F983B42-FBCB-4D53-AE35-982CA784FF3F.png

設定は、プライベート API Gateway 構築時に作成済みのはずの VPC エンドポイントを指定するだけです。

3319BAEF-FA09-4F43-946D-D020BD1FF7B2.png

この VPC エンドポイントのカスタムドメインですが、Route 53 プライベートホストゾーンで管理出来ます。厳密には VPC エンドポイントの IP アドレスへ、プライベートネットワーク内から名前解決出来れば OK です。
今回は API Gateway と CloudShell が存在する VPC に関連付けした Route 53 プライベートホストゾーンを作成しました。

1C0B6BBB-DC4D-4144-BE98-58BEE415088A.png

でレコードを作成します。ここで注意点なのですがトラフィックルーティング先は API Gateway ではないのでご注意ください。プライベート API エンドポイントタイプの場合は選択肢に出てこないはずです。

8C31B0D0-6E80-4AD4-A1BB-F6CBAEA7A7AB.png

ここで指定するのはプライベート API Gateway 用に作成した VPC エンドポイントのエイリアスになります。

64864D90-8785-4860-9404-E6266C350E74.png

さてここまでで設定は一通り終わりかな?と思って API にアクセスしてみたところUser: anonymous is not authorized to performというエラーが発生しました。権限がないようです。

[cloudshell-user@ip-10-0-136-248 ~]$ curl https://hoge0106api.tak1wa.com/
{"Message":"User: anonymous is not authorized to perform: execute-api:Invoke on resource: arn:aws:execute-api:ap-northeast-1:********7088:/domainnames/hoge0106api.tak1wa.com+ir41smqp82 with an explicit deny"}

上記ですが、拒否されているリソースをよく見るとカスタムドメインリソースに対して拒否されているのがわかります。
よく見てみるとカスタムドメイン詳細画面に次のようにリソースポリシータブがあります。従来のパブリックカスタムドメインではありませんでした。

C30EE8D2-97A4-4EFD-8D58-3BB587B14F16.png

上記がデフォルトでは ALL DENY になっています。
ここでは次の公式ドキュメントに従って、対象 VPC エンドポイント経由の場合に許可させます。

https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-custom-domains-tutorial.html

API Gateway のリソースポリシーとは別にカスタムドメイン自体にもリソースポリシーがあるという点を覚えておきましょう。

7DF6D446-BBC4-4C1D-9F6B-70F4390CD650.png

ここまで行って遂にプライベート API のカスタムドメイン対応が出来ました。やったー。

[cloudshell-user@ip-10-0-136-248 ~]$ curl https://hoge0106api.tak1wa.com/
{"hoge":"fuga"}

さいごに

本日は Amazon API Gateway のプライベート REST API でカスタムドメインが使えるようになっていたので設定してみました。

API Gateway でプライベートエンドポイントタイプを選択したことのある方は、カスタムドメインがサポートされていなかったことに悩んだ方多いのではないでしょうか。

追加料金も発生しないようですし、これは非常に良いアップデートですね。
NLB/ALB などを前段に配置している方は乗り換えを検討しても良いかもしれない。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.